(* use_dsp = "no", use_carry_chain = "yes" *)
module mant_add (
    //input clk,
    //input sys_rst_n,
    input [26:0] m1,         // 输入尾数1（隐含位1 + 尾数23 + GRS3）
    input [26:0] m2,         // 输入尾数2（格式同上）
    input s1, s2,            // 符号位
    //input [7:0] e_align,
    output [27:0] sum,   // 输出尾数（格式同上）
    output sign_out     // 输出符号
    //output reg co           // 进位信号（1表示溢出，需调整指数）
    //output reg [7:0] e_align_reg // 对齐后的指数
);
/*     reg [26:0] sum;
    reg sign_out;
    reg co;
 */
    // ================== 符号处理 ==================
    wire same_sign = (s1 == s2);     // 符号相同标志
    wire m1_gt_m2 = (m1 >= m2);
    // ================== 运算逻辑 ==================
    //wire [27:0] sum_temp;     // 扩展1位用于捕获进位/借位
    // 预计算所有可能的结果
    wire [27:0] sum_add = m1 + m2;
    wire [27:0] sum_sub1 = m1 - m2;
    wire [27:0] sum_sub2 = m2 - m1;
/*     always @(*) begin
        if (same_sign) begin
            // 同符号加法
            sum_temp = {1'b0, m1} + {1'b0, m2};  // 28位运算
            sign_out = s1;
        end else begin
            // 异符号减法，比较绝对值大小
            if (m1 >= m2) begin
                sum_temp = {1'b0, m1} - {1'b0, m2};
                sign_out = s1;
            end else begin
                sum_temp = {1'b0, m2} - {1'b0, m1};
                sign_out = s2;
            end
        end 



        // 提取进位信号（最高位）
        co = sum_temp[27];    // co=1表示溢出，需右移尾数并调整指数
        sum = sum_temp[26:0]; // 截取低27位作为结果尾数
    end*/
    // 使用多路选择器选择正确的结果
    assign sum = same_sign ? sum_add :
                     (m1_gt_m2)? sum_sub1 : sum_sub2;
    assign sign_out = same_sign ? s1 : (m1_gt_m2 ? s1 : s2);
/*     always @(posedge clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            sum_reg <= 27'd0;
            sign_out_reg <= 1'b0;
            co_reg <= 1'b0;
            e_align_reg <= 8'd0;
        end
        else begin
            sum_reg <= sum;
            sign_out_reg <= sign_out;
            co_reg <= co;
            e_align_reg <= e_align;
        end
    end */
endmodule